# Python虽然语法上支持多继承，但是却不推荐使用多继承，而是推荐使用单继承，这样可以保证编程思路更清晰，也可以避免不必要的麻烦。
# 继承
# 类的定义
class Test:
    # 定义基本属性
    name = 'Daniel'
    sex = 'male'
    # 定义私有属性，私有属性在类外部无法直接进行访问
    __weight = 60

    # 定义构造方法
    # 注意：__init__() 方法的第一个参数必须是 self（self代表类的实例，可以用别的名字，但建议使用约定成俗的self），后续参数则可以自由指定，和定义函数没有任何区别。
    def __init__(self, name, sex, weight) -> None:
        self.name = name
        self.sex = sex
        self.__weight = weight

    def info(self):
        print('Test类中的info方法:', self.name, self.sex, self.__weight)


class Item:
    def info(self):
        print('Item类中的info方法')


class Product:
    def info(self):
        print('Product类中的info方法')


# 单继承
class My_test(Test):
    grade = ''

    def __init__(self, name, sex, weight, grade) -> None:
        # 调用父类构造方法
        # 重写构造方法的两种形式，推荐使用super的形式，构造方法重写时注意参数传递。
        # Test.__init__(self, name, sex, weight)
        super(My_test, self).__init__(name, sex, weight)
        self.grade = grade
    # 重写覆盖父类的方法

    def info(self):
        print('Test类中的info方法:', self.name, self.sex, self.grade)
        # 当子类重写父类方法之后，子类如果想再次调用父类的方法，可以使用这两种方法
        # 方法一：
        Test.info(self)
        # 方法二：
        # super()函数可以调用父类的方法，在父类中也使用super函数之后，可以通过调用类的mro方法属性来查看继承关系
        super().info()
        # print(My_test.mro())


# 多继承
class Computer(Item, Product):
    pass


if __name__ == '__main__':
    m = My_test('Alisa', 'male', 78, '12class')
    m.info()
    c = Computer()
    c.info()
    # 控制台打印的是Item类中的方法，所以说子类所继承的父类中的方法，如果存在同名，前面的会“遮蔽”后面的，即子类会优先使用最先被继承的方法
